package com.yonyougov.devops.cruxcisupport.appenv;

import com.yonyougov.devops.cruxcisupport.appenv.dto.*;
import com.yonyougov.devops.cruxcisupport.appenv.vo.AppEnvPageLikeReqVo;
import com.yonyougov.devops.cruxcisupport.appenv.vo.AppEnvPageLikeRespVo;
import com.yonyougov.devops.cruxcisupport.appenv.vo.AppEnvPageVo;
import com.yonyougov.devops.cruxcisupport.appenv.vo.AppEnvVo;
import com.yonyougov.devops.fwc.api.dto.BaseResponseDto;
import com.yonyougov.devops.fwc.core.service.BaseService;

import javax.servlet.ServletOutputStream;
import java.math.BigInteger;
import java.util.List;
import java.util.Map;

/**
 * t_app_env服务
 */
public interface AppEnvService extends BaseService<AppEnvEntity, BigInteger> {
    List<AppEnvPageVo> findAllJoinBy(AppEnvPageLikeDbParams appEnvEntity);

    String getDeployFile(String appName, String envName);

    String getConfigMap(String envName);

    /**
     * 下载k8s部署文件
     *
     * @param envName
     * @param outputStream
     */
    void downloadEnv(String envName, ServletOutputStream outputStream);

    /**
     * 根据环境名称获取所有的版本信息
     *
     * @param envName
     * @return
     */
    String getAppVersionByEnv(String envName);

    /**
     * 同步两个环境的应用配置信息
     *
     * @param sourceEnv
     * @param targetEnv
     * @return
     */
    boolean syncData(String sourceEnv, String targetEnv);

    int countByJoin(AppEnvPageLikeDbParams appEnvEntityVo);

    BaseResponseDto findAppEnvLikePage(AppEnvPageLikeDbParams dbParams);

    List<AppEnvPageLikeRespVo> findPageLike(AppEnvPageLikeReqVo appEnvPageLikeReqVo);

    int countByPageLike(AppEnvPageLikeReqVo appEnvPageLikeReqVo);

    void deleteAppEnvWithAppendages(AppEnvEntity appEnvEntity);

    BaseResponseDto findAppEnvPage(AppEnvPageDbParams appEnvEntityDto);

    List<AppEnvPageVo> findAppEnvPageBy(AppEnvPageDbParams dbParams);

    int countByAppEnvPage(AppEnvPageDbParams dbParams);

    /**
     * 根据环境名称和应用名称获取部署
     *
     * @param envName 环境名称
     * @param appName 应用名称
     * @return AppEnvVo
     */
    AppEnvVo findByEnvNameAndAppName(String envName, String appName);

    /**
     * 批量删除
     *
     * @param appEnvBatchDeleteDto 批量删除Dto
     */
    void batchDeleteAppEnvWithAppendages(AppEnvBatchDeleteDto appEnvBatchDeleteDto) throws Exception;

    /**
     * 更新
     *
     * @param appEnvEntity 实体
     */
    void updateAppEnv(AppEnvEntity appEnvEntity);

    /**
     * 版本信息初始化
     *
     * @param versionInitDto 版本初始化Dto
     */
    void versionInit(VersionInitDto versionInitDto);

    /**
     * 根据环境名称和应用名称更新
     *
     * @param updateByEnvNameAndAppNameDtoList List<UpdateByEnvNameAndAppNameDto>
     */
    void updateByEnvNameAndAppName(List<UpdateByEnvNameAndAppNameDto> updateByEnvNameAndAppNameDtoList);

    /**
     * 打印端口映射单子
     * @param env 环境名称
     * @return 端口映射单dto
     */
    List<PortBillResponseDto> printPortReport(String env);

    /**
     * 打印某个环境下所有的应用版本
     * @param env 环境名称
     * @return
     */
    Map<String, String> printVersionReport(String env);

    /**
     * 获取部署后的服务内部端口
     * 约定: 名称为http的即为服务端口
     * @param appEnvId 部署id
     * @return 部署后的服务端口
     */
    Integer getServiceInnerPort(BigInteger appEnvId) throws Exception;

    /**
     * 获取部署后的服务外部端口
     * 约定: 名称为http的即为服务端口
     * @param appEnvId 部署id
     * @return 部署后的服务端口
     */
    Integer getServiceOutPort(BigInteger appEnvId) throws Exception;

    /**
     * 部署检查
     * 必须有服务端口，且如果应用设置了暴漏端口，必须映射出去
     * @param appEnvId 部署id
     */
    void deployCheck(BigInteger appEnvId) throws Exception;
}
